import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建线程池（单线程池、固定大小线程池、可缓存的线程池、无限大小的线程池）

        //单线程的线程池只有一个线程，相当于串行，所有任务按提交顺序执行。
        //由于异常而结束后，会有一个新的线程代替它。
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(new MyRunnable6());
        executorService.execute(new MyRunnable6());
        executorService.shutdown();

        //固定大小线程池,每次提交一个任务就创建一个线程，直到线程池的最大容量，一旦达到最大值就保持不变。
        //某个线程由于异常而结束后，会有一个新的线程代替它。
        ExecutorService executorService1 = Executors.newFixedThreadPool(2);
        executorService1.execute(new MyRunnable7());
        executorService1.execute(new MyRunnable7());
        executorService1.shutdown();

        //可缓存的线程池，如果线程池大小超过处理任务所需线程，则回收部分空闲线程（60秒不执行任务）
        //当任务数量增加时，此线程池会添加新的线程。
        //此线程池不会对大小做限制，大小以来于JVM能创建的最大线程数量。
        ExecutorService executorService2 = Executors.newCachedThreadPool();

        //无限大小的线程池，支持定时以及周期性执行的任务
        //初始容量corePoolSize
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        //延迟3秒执行new MyRunnable6()。
        scheduledExecutorService.schedule(new MyRunnable6(), 2000, TimeUnit.MILLISECONDS);
        scheduledExecutorService.shutdown();
    }
}

class MyRunnable6 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "-- " + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

class MyRunnable7 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "-- " + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}